import axios, { AxiosInstance } from 'axios';

// 假设的refreshToken函数，用于刷新Token  
async function refreshToken(): Promise<string> {
    // 这里应该发送一个请求到你的API来刷新Token  
    // 为了示例，我们直接返回一个模拟的新Token  
    return 'new_access_token_here';
}

// 创建一个Axios实例  
const api: AxiosInstance = axios.create({
    baseURL: 'https://your-api.com/api',
    timeout: 5000,
});

// 存储当前Token的变量（实际项目中应存储在localStorage、sessionStorage等）  
let currentToken = localStorage.getItem('token') || '';

// 更新Token的函数，同时更新Axios实例的headers  
function updateToken(newToken: string) {
    currentToken = newToken;
    localStorage.setItem('token', newToken);
    // 更新Axios实例的headers  
    api.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
}

// 添加请求拦截器  
api.interceptors.request.use(
    (config) => {
        // 确保headers对象存在并添加Token  
        config.headers = config.headers || {};
        if (currentToken) {
            config.headers['Authorization'] = `Bearer ${currentToken}`;
        }
        return config;
    },
    (error) => {
        // 处理请求错误  
        return Promise.reject(error);
    }
);

// 添加响应拦截器  
api.interceptors.response.use(
    (response) => {
        // 处理响应数据  
        return response;
    },
    async (error) => {
        if (error.response && error.response.status === 401) {
            try {
                // 尝试刷新Token  
                const newToken = await refreshToken();
                updateToken(newToken);

                // 如果需要，可以重新发送原始请求  
                // 注意：这里需要手动处理，因为axios拦截器不支持自动重试  
                // 你可以使用axios的retry库，或者根据具体需求自定义逻辑  
                // 例如，你可以将原始请求的config保存在某处，并使用新Token重新发送它  
                // 但在这个简单的示例中，我们只是返回了错误信息  
                // 实际项目中，你可能需要抛出一个特定的错误，让调用者知道需要重新尝试请求  
                return Promise.reject(new Error('Token refreshed, but request not retried automatically.'));
            } catch (refreshError) {
                // 刷新Token失败，处理错误（如重定向到登录页面）  
                console.error('Failed to refresh token:', refreshError);
                // 清除Token（可选）  
                localStorage.removeItem('token');
                currentToken = '';
                // 更新Axios实例的headers以移除旧的Token  
                delete api.defaults.headers.common['Authorization'];
                // 返回Promise.reject以停止后续的.then链  
                return Promise.reject(error);
            }
        }

        // 对于非401错误，直接返回Promise.reject  
        return Promise.reject(error);
    }
);

export default api;